#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdbool.h>
#include "prime.h"
#include <vector>
#include <iostream>
#include <omp.h>
using namespace std;





void display_usage()
{
    printf("Please use -n option to specify thread count, like -n 2...\n");

}


int main(int argc, char *argv[])
{
    if (argc !=3) {
        display_usage();
        return 0;
    }
    int opt = 0;
    int thread_count = 1;
    while ( opt != -1 )
    {
        switch ( opt )
        {
        case 'n':
            thread_count = atoi(optarg);
            break;


        case 'h':   /* намеренный проход в следующий case-блок */
        case '?':
            display_usage();
            break;

        default:
            /* сюда на самом деле попасть невозможно. */
            break;
        }

        opt = getopt( argc, argv, "n:" );
    }
    printf("thread count is : %d \n", thread_count);
    vector<int> res;
    int count = 0;
    int i;

    #pragma omp parallel num_threads(thread_count) default(none) private(i) shared(count,res,thread_count)
    {
        int task_id = omp_get_thread_num();
        printf("task_id is : %d \n", task_id);
        i = task_id+1;
        

        while (true){
            
            if (count==11)
                break;
            if (check_truncatable_prime(i)){
                count++;
                #pragma omp critical
                res.insert(res.begin(),i);
            }
            //printf("%d ", i);
            i +=thread_count;
        }

        

    }

    for (int i=0; i<res.size(); i++){
        cout << res[i] << " ";
    }
    
    

    return 0;

}
